package 多线程.TheadPoolManager;

/**
 * @author : K k
 * @date : 10:03 2020/9/30
 * 停止线程的方案：
 * 总体整理下来就三种方式！1、正常退出;2、stop暴力停止（不再推荐使用）；3、异常法;
 * 1、正常退出
 * 当线程中run()或者call()按照逻辑流程正常的执行结束了，线程也就自然停止了。
 *
 * 2、stop暴力停止
 * 直接在程序中使用thread.stop()，线程会马上停止，但是可能导致数据不同步，或者资源得不到回收的问题而且stop已经标注为作废方法，所以使用一定要慎重。
 *
 * 3、interrupt()异常法。
 *    只要线程处于阻塞状态配合interrupt()都能使线程停止，而且停止的方式都是通过抛异常。
 *    先中断再阻塞抛出异常
 */
public class InterruptService implements Runnable {
    //如果使用Callable接口中call方法异常就会得以扩散
    @Override
    public void run() {
        try {
            synchronized (this) {
                System.out.println("begin run");
                //重要：无论是先中断还是先阻塞都能达到停止线程的目的，
                // 只要两者配置使用（先中断再阻塞）就可以到达抛出异常的效果
                Thread.currentThread().interrupt();
                //方式一，线程进入sleep
                Thread.sleep( 10 );
                //方式二、join
                //Thread.currentThread().join();
                //方式三、wait
                //this.wait();
                //Thread.sleep(10);
                //System.out.println(Thread.currentThread().isInterrupted());
                System.out.println("begin end");
            }
        } catch (Exception e) {
            System.out.println("先interrupt再阻塞后终止了");
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        try {
            InterruptService interruptService = new InterruptService();
            Thread thread = new Thread(interruptService);
            thread.start();
            Thread.sleep(2000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
